/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.common.orm;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

/**
 * 任何数据对象都应该继承此类。
 */
@Setter
@Getter
public abstract class BaseDataObject implements Serializable {

    /**
     * 主键ID，注意：此ID不要参与任何业务逻辑，让它安静的自增就好了，处理业务逻辑用具体实体类的ID，如ServiceItemEntity#serviceItemId.
     * 参数 type = IdType.INPUT 或 type = IdType.AUTO 的设置，请通过配置 mybatis-plus.global-config.db-config.id-type 为 input 或 auto 来设置。
     */
    @TableId(value = "ID")
    private Long id;

    /**
     * 创建时间
     */
    @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 创建人ID
     */
    @TableField(value = "CREATOR_ID")
    private String creatorId;

    /**
     * 修改时间
     */
    @TableField(value = "MODIFY_TIME", fill = FieldFill.INSERT_UPDATE)
    private Date modifyTime;

    /**
     * 修改人ID
     */
    @TableField(value = "MODIFIER_ID")
    private String modifierId;

    /**
     * 状态：0-已删除，1-正常状态（启用）
     */
    @TableField(value = "ACTIVE")
    private Integer active;

    /**
     * 版本号
     */
    @TableField(value = "VERSION")
    private Integer version;

    // region findbugs
    public Date getCreateTime() {
        return (Date) createTime.clone();
    }

    public void setCreateTime(Date createTime) {
        this.createTime = (Date) createTime.clone();
    }

    public Date getModifyTime() {
        return (Date) modifyTime.clone();
    }

    public void setModifyTime(Date modifyTime) {
        this.modifyTime = (Date) modifyTime.clone();
    }
    // endregion

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        BaseDataObject that = (BaseDataObject) o;
        if (id == null || that.id == null) {
            return false;
        }
        return Objects.equals(id, that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
